package br.ufrn.sipac.patrimonio.coletor.dao;

import java.sql.SQLException;
import java.util.List;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import br.ufrn.sipac.patrimonio.coletor.dominio.Persistencia;
import br.ufrn.sipac.patrimonio.coletor.helper.DatabaseHelper;

import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.GenericRawResults;
import com.j256.ormlite.support.ConnectionSource;

public class GenericDaoORM<T extends Persistencia> extends
		OrmLiteSqliteOpenHelper implements GenericDAO<T> {

	private final Class<T> type;

	protected Dao<T, Integer> dao = null;

	public GenericDaoORM(final Context context, final Class<T> type)
			throws SQLException {
		super(context, DatabaseHelper.DATABASE_NAME, null,
				DatabaseHelper.DATABASE_VERSION);
		this.type = type;
		if (dao == null)
			dao = getDao(type);
	}

	@Override
	public T queryForId(final Integer id) {
		// IMPLEMENTAR
		return null;
	}

	@Override
	public List<T> queryForAll() {
		// IMPLEMENTAR
		return null;
	}

	@Override
	public void save(final T object) throws SQLException {
		dao = getDao(object.getClass());
		dao.create(object);
	}

	@Override
	public void merge(final T object) {
		try {
			dao.update(object);

		} catch (java.sql.SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void delete(final T object) {
		try {
			dao.delete(object);
		} catch (java.sql.SQLException e) {

		}
	}

	@Override
	public void createOrUpdate(T object) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2,
			int arg3) {
		// TODO Auto-generated method stub

	}

	/**
	 * Método responsável por listar todos os objetos da classe persistidos, com
	 * base no objectSet, que é uma interface que serve como cursor para fazer
	 * iterações em um conjunto de objetos recuperados em uma consulta,
	 * recebendo as instâncias de todos os objetos encontrados, como esse
	 * método, não possui nenhum filter ou comparador para limitar os registros
	 * recuperados, ele trará tudo.
	 * 
	 * @throws SQLException
	 */
	public int capturarMaiorId(Class classe, Context context)
			throws SQLException {

		GenericRawResults<String[]> os = null;
		int maiorId = 0;
		dao = getDao(classe);
		os = dao.queryRaw("select max(id) from " + classe.getSimpleName());
		if (os.getResults() == null || os.getResults().isEmpty())
			return 0;
		maiorId = Integer.parseInt(os.getFirstResult()[0]);
		return maiorId;
	}

}
